home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tools / jade / src / amiga_server.c < prev    next >
C/C++ Source or Header  |  1995-03-09  |  4KB  |  173 lines

  1. /* amiga_server.c -- editor server for Amiga
  2.    Copyright (C) 1994 John Harper <jsh@ukc.ac.uk>
  3.  
  4.    This file is part of Jade.
  5.  
  6.    Jade is free software; you can redistribute it and/or modify it
  7.    under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 2, or (at your option)
  9.    any later version.
  10.  
  11.    Jade is distributed in the hope that it will be useful, but
  12.    WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with Jade; see the file COPYING. If not, write to
  18.    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include "jade.h"
  21. #include "jade_protos.h"
  22.  
  23. #include <clib/exec_protos.h>
  24. #include <exec/ports.h>
  25.  
  26. #include "amiga_server.h"
  27.  
  28. _PR void server_accept(void);
  29. _PR void server_init(void);
  30. _PR void server_kill(void);
  31.  
  32. /* List of (FILE-NAME . CLIENT-MSG) where CLIENT-MSG is a pointer (number)
  33.    to the struct clientmsg  */
  34. static VALUE client_list;
  35.  
  36. static VALUE sym_server_open_file;
  37.  
  38. /* Signal mask for the server's message port. */
  39. _PR u_long server_sig;
  40. u_long server_sig;
  41.  
  42. /* The server's msgport */
  43. static struct MsgPort *server_port;
  44.  
  45. /* Called when the eventloop receives server_sig */
  46. void
  47. server_accept(void)
  48. {
  49.     struct clientmsg *cm;
  50.     while(cm = (struct clientmsg *)GetMsg(server_port))
  51.     {
  52.     VALUE file = string_dup(cm->cm_file);
  53.     client_list = cmd_cons(cmd_cons(file, make_number((u_long)cm)), client_list);
  54.     cursor(curr_vw, CURS_OFF);
  55.     call_lisp2(sym_server_open_file, file, make_number(cm->cm_num - 1));
  56.     std_message(curr_vw);
  57.     refresh_world();
  58.     cursor(curr_vw, CURS_ON);
  59.     }
  60. }
  61.  
  62. _PR VALUE cmd_server_open_p(void);
  63. DEFUN("server-open-p", cmd_server_open_p, subr_server_open_p, (void), V_Subr0, DOC_server_open_p)
  64. {
  65.     if(server_port)
  66.     return(sym_t);
  67.     return(sym_nil);
  68. }
  69.  
  70. _PR VALUE cmd_server_open(void);
  71. DEFUN_INT("server-open", cmd_server_open, subr_server_open, (void), V_Subr0, DOC_server_open, "")
  72. {
  73.     VALUE res = sym_t;
  74.     if(!server_port)
  75.     {
  76.     Forbid();
  77.     if(FindPort(JADE_PORT_NAME))
  78.     {
  79.         message("A server is already open.");
  80.         res = sym_nil;
  81.     }
  82.     else
  83.     {
  84.         server_port = CreateMsgPort();
  85.         if(server_port)
  86.         {
  87.         server_port->mp_Node.ln_Name = JADE_PORT_NAME;
  88.         server_port->mp_Node.ln_Pri = 1;
  89.         AddPort(server_port);
  90.         server_sig = 1 << server_port->mp_SigBit;
  91.         }
  92.         else
  93.         res = cmd_signal(sym_error, LIST_1(MKSTR("Can't CreateMsgPort()")));
  94.     }
  95.     Permit();
  96.     }
  97.     return(res);
  98. }
  99.  
  100. _PR VALUE cmd_server_close(void);
  101. DEFUN_INT("server-close", cmd_server_close, subr_server_close, (void), V_Subr0, DOC_server_close, "")
  102. {
  103.     if(server_port)
  104.     {
  105.     RemPort(server_port);
  106.     DeleteMsgPort(server_port);
  107.     server_port = NULL;
  108.     server_sig = 0;
  109.     }
  110.     return(sym_t);
  111. }
  112.  
  113. _PR VALUE cmd_server_reply(VALUE file, VALUE rc);
  114. DEFUN("server-reply", cmd_server_reply, subr_server_reply, (VALUE file, VALUE rc), V_Subr2, DOC_server_reply)
  115. {
  116.     VALUE res = sym_nil;
  117.     VALUE tmp = client_list;
  118.     if(BUFFERP(file))
  119.     file = VTX(file)->tx_FileName;
  120.     else if(!STRINGP(file))
  121.     file = curr_vw->vw_Tx->tx_FileName;
  122.     client_list = sym_nil;
  123.     while(CONSP(tmp))
  124.     {
  125.     register VALUE car = VCAR(tmp);
  126.     VALUE next = VCDR(tmp);
  127.     if(!VALUE_CMP(file, VCAR(car)))
  128.     {
  129.         /* Send the result to our client. */
  130.         struct clientmsg *cm = (struct clientmsg *)VNUM(VCDR(car));
  131.         cm->cm_num = NUMBERP(rc) ? VNUM(rc) : 0;
  132.         ReplyMsg(&cm->cm_msg);
  133.         res = sym_t;
  134.     }
  135.     else
  136.     {
  137.         VCDR(tmp) = client_list;
  138.         client_list = tmp;
  139.     }
  140.     tmp = next;
  141.     }
  142.     return(res);
  143. }
  144.  
  145. void
  146. server_init(void)
  147. {
  148.     client_list = sym_nil;
  149.     mark_static(&client_list);
  150.     INTERN(sym_server_open_file, "server-open-file");
  151.     ADD_SUBR(subr_server_open_p);
  152.     ADD_SUBR(subr_server_open);
  153.     ADD_SUBR(subr_server_close);
  154.     ADD_SUBR(subr_server_reply);
  155. }
  156.  
  157. void
  158. server_kill(void)
  159. {
  160.     VALUE tmp = client_list;
  161.     while(CONSP(tmp))
  162.     {
  163.     /* Any client-opened files still around are replied to with
  164.        a result of 5 (fail).  */
  165.     struct clientmsg *cm = (struct clientmsg *)VNUM(VCDR(VCAR(tmp)));
  166.     cm->cm_num = 5;
  167.     ReplyMsg(&cm->cm_msg);
  168.     tmp = VCDR(tmp);
  169.     }
  170.     client_list = sym_nil;
  171.     cmd_server_close();
  172. }
  173.